package org.gridlab.gridsphere.services.visualization;

import java.io.Writer;
import java.io.IOException;
import java.io.PrintWriter;
import javax.portlet.RenderResponse;
import javax.portlet.RenderRequest;
import javax.portlet.PortletContext;

/**
 * Klasa zbierająca informacje o wprowadzonych danych. Umożliwia "odpluskwianie" DataProvider'ów
 * @author Krzysztof Goj
 */
public class DebugChartGenerator extends ChartGenerator {
    
    /**
     * Tworzy nowy obiekt typu DebugChartGenerator
     * @param dp DataProvider z danymi dla tego typu wykresu
     * @param c Kontekst portletu
     */
    public DebugChartGenerator(DataProvider dp, PortletContext c) {
        super(dp, c);
    }

    /**
     * Generuje kod HTML z danymi na temat wykresu oraz wyświetla go za pomocą portletu
     * @param request Obiekt żądania od klienta
     * @param response Obiekt odpowiedzi do klienta
     * @throws java.io.IOException Wyjatek generowany w przypadku, gdy wystąpi błąd I/O
     */
    public void embedChart(RenderRequest request, RenderResponse response) throws IOException {
        PrintWriter out = new PrintWriter(response.getWriter());
        out.print("<h3>Debug chart generator <i>");
        out.print(getURLNamePart());
        out.println("</i></h3>");

        out.print("<b>data type:</b> <i>");
        out.print(dataProvider.getDataType().getName());
        out.println("</i>");

        if(Object[][].class.isAssignableFrom(dataProvider.getDataType())) {
            out.println("<h4>2D array</h4>");
            out.print("<h3>");
            out.print(dataProvider.getSeriesCount());
            out.println(" series</h3>");
            for(int s=0; s<dataProvider.getSeriesCount(); ++s) {
                Object[][] arr = (Object[][]) dataProvider.getData(s);
                out.println("<hr />");
                out.print("<b>");
                out.print(dataProvider.getSeriesName(s));
                out.println(":</b> ");
                out.println("<table>");
                for(int i=0; i<arr.length; ++i) {
                    out.print("<tr>");
                    for(int j=0; j<arr[i].length; ++j) {
                        out.print(" <td>");
                        out.print(arr[i][j]);
                        out.print("</td>");
                    }
                    out.println(" </tr>");
                }
                out.println("</table>");
                out.println("<hr />");
            }
        }
        else if(Object[].class.isAssignableFrom(dataProvider.getDataType())) {
            out.println("<h4>1D array</h4>");
            out.print("<h3>");
            out.print(dataProvider.getSeriesCount());
            out.println(" series</h3>");
            for(int s=0; s<dataProvider.getSeriesCount(); ++s) {
                out.print("<b>");
                out.print(dataProvider.getSeriesName(s));
                out.println(":</b> ");
                out.print(" [");
                out.print(dataProvider.getData(s).getClass().getName());
                out.println("]<hr />");
                Object[] arr = (Object[]) dataProvider.getData(s);
                for(int i=0; i<arr.length; ++i) {
                    if(i>0) out.print(", ");
                    out.print(arr[i]);
                    out.print(" [");
                    out.print(arr[i].getClass().getName());
                    out.print("] ");
                }
                out.println("<hr />");
            }
        }
        else
            out.println("<h4>dunno</h4>");
    }

    /**
     * Generuje wykres na podstawie dostarczonych danych
     */
    protected void generateChart() {}
    /**
     * Zwraca typ danych wymagany przez ten ChartGenerator
     * @return Typ danych wymagany przez ten ChartGenerator
     */
    protected Class dataType() {return Object.class;}
}



